/*
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通（但不一定有直接的公路相连，只要能间接通过公路可达即可）。现得到城镇道路统计表，
表中列出了任意两城镇间修建道路的费用，以及该道路是否已经修通的状态。现请你编写程序，计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 )；随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态，
每行给4个正整数，分别是两个村庄的编号（从1编号到N），此两村庄间道路的成本，以及修建状态：1表示已建，0表示未建。

当N为0时输入结束。
Output
每个测试用例的输出占一行，输出全省畅通需要的最低成本。
Sample Input
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
Sample Output
3
1
0
 */
package com.yuan.algorithms.training20150807;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月23日 上午10:00:30
 * @Explain 说明:已经修好的路，设置成本为0，然后使用prim算法计算最小成本。
 */
public class 图论_继续畅通工程 {

	static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static int nextInt() throws IOException { in.nextToken(); return (int) in.nval;}
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	
	static int S = 110;
	static int map[][] = new int[S][S];
	static boolean[] mark = new boolean[S];
	static int n;
	static final int MAX = 0xfffffff;
	
	public static void main(String[] args) throws IOException {
		while(in.nextToken() != in.TT_EOF) {
			n = (int) in.nval;
			if (n == 0) {
				break;
			}
			initialise();
			for (int i = 0, m = (n * (n - 1)) >> 1; i < m; i++) {
				int a = nextInt() - 1;
				int b = nextInt() - 1;
				int cost = nextInt();
				int status = nextInt();
				if (status == 1) {
					cost = 0;//已经修好的路，设置成本为0
				}
				if (map[a][b] > cost) {
					map[a][b] = map[b][a] = cost;
				}
			}
			prim();
		}
	}

	private static void prim() {
		int sum = 0;
		mark[0] = true;
		for (int i = 0; i < n - 1; i++) {
			int min = MAX;
			int index = -1;
			for (int j = 0; j < n; j++) {
				if (!mark[j] && map[0][j] < min) {
					min = map[0][j];
					index = j;
				}
			}
			if (index == -1) {
				out.println("no");
				return;
			}
			mark[index] = true;
			sum += min;
			for (int j = 0; j < n; j++) {
				if (!mark[j] && map[0][j] > map[index][j]) {
					map[0][j] = map[index][j];
				}
			}
		}
		out.println(sum);
		out.flush();
	}

	private static void initialise() {
		for (int i = 0; i < n; i++) {
			mark[i] = false;
			for (int j = 0; j < n; j++) {
				map[i][j] = MAX;
			}
		}
	}

}
